Semantik Web  •  Hafta 07

SWRL: Kurallarla Çıkarım

Kural sözdizimi, built-in'ler, DL-safe kısıt ve alerji ontolojisinin yedi kuralının (S1–S7) tasarımı

Lisansüstü Semantik Web Dersi  •  CMPE 583

Hafta 07  •  Kazanımlar

Bu hafta sonunda

  • SWRL kuralını atom atom okuyup yazabileceksiniz.
  • Class, individual, object/data property atomlarını doğru kullanabileceksiniz.
  • Built-in'lerle aritmetik ve karşılaştırma yapabileceksiniz.
  • Kısıtları (yaş, BMI, miktar eşiği) kurala çevirebileceksiniz.
  • Kuralı Protégé'de çalıştırıp Java'dan aynı sonucu üretebileceksiniz.

01

Ödev 6'nın Çözümü

BMI uyarı adımının servise eklenmesi.

Çözüm 6.1 — BMIWarning adımı

AlanCevap
hasInputPerson (hasWeight, hasHeight bildirilmiş)
hasOutputBMIReport — değer + kategori
PreconditionhasWeight(?p,?w) ^ hasHeight(?p,?h)
EffecthasBMI(?p,?b) — S4 kuralı yazar
Sequence'te yeriRunSWRLRules'dan sonra, rapordan önce

Sıra önemlidir: BMI bir çıkarım ürünüdür, kural motoru çalışmadan okunamaz.

02

SWRL Temelleri

Neden kural? Sözdizimi, atomlar, değişkenler.

OWL neyi ifade edemez?

İhtiyaçOWLSWRL
Özellik zinciri sonunda yeni ilişkiSınırlı (propertyChain)Doğrudan
Aritmetik (BMI, miktar)YokBuilt-in
Sayısal karşılaştırma (yaş ≥ 18)Veri aralığı ile dolaylıDoğrudan
Metin işleme (kod eşleme)YokBuilt-in
Değişkenli koşul birleşimiYokGövde atomları

Projedeki soru tam olarak buradan doğar: "kişinin alerjisini, seçtiği ürünün içerdiği katkı tetikliyorsa" — üç özelliği zincirleyip dördüncü bir ilişki üretmek gerekir.

Kuralın anatomisi

Person(?p) ^ hasAge(?p, ?a) ^ swrlb:greaterThanOrEqual(?a, 18) -> Adult(?p)

Gövde (antecedent)

Oktan önce. Koşullar VE'lenir.

Baş (consequent)

Oktan sonra. Üretilecek bilgi.

Değişken

?p — soru işareti ile başlar.

Atom türleri

TürYazımProjeden örnek
Class atomC(?x)Person(?p)
Object property atomP(?x, ?y)Contain(?u, ?f)
Data property atomD(?x, ?v)hasAge(?p, ?a)
Built-in atomswrlb:fn(...)swrlb:divide(?b, ?w, ?h2)
sameAs / differentFromsameAs(?x, ?y)İki barkodun aynılığı
Data range atomxsd:int(?a)Tip denetimi
Birey sabitiP(?x, Ind)Triggers(?f, Lactose)

Class ve subclass atomları

# Sinif atomu: uyelik kosulu Person(?p) ^ hasAge(?p, ?a) ^ swrlb:lessThan(?a, 18) -> Minor(?p) # Alt sinif zaten cikarim uretir; kuralda ust sinif kullanmak yeterli Adult(?p) ^ Effected_Allergen(?p, ?f) -> AdultAtRisk(?p) # Sinif atomu bas tarafta: yeni uyelik yazar Effected_Allergen(?p, ?f) -> PersonAtRisk(?p)

Gövdedeki Adult(?p) atomu, RDFS/OWL çıkarımıyla üretilmiş üyelikleri de görür — kural motoru reasoner'ın sonucu üzerinde çalışır.

Object vs Data property atomu

Object property (OTP)

hasAllergy(?p, ?al) ChooseProduct(?p, ?u) Contain(?u, ?f) Triggers(?f, ?al) # ikinci arg BIREYDIR

Data property (DTP)

hasAge(?p, ?a) hasWeight(?p, ?w) hasHeight(?p, ?h) hasBMI(?p, ?b) # ikinci arg DEGERDIR

Karıştırmak en sık hatadır: hasAllergy(?p, "Lactose") asla eşleşmez — Lactose bir bireydir, metin değil.

Güvenli kural: her değişken bağlanmalı

Hatalı

Person(?p) -> Effected_Allergen(?p, ?f) # ?f govdede bagli degil

Doğru

Person(?p) ^ ChooseProduct(?p, ?u) ^ Contain(?u, ?f) -> Effected_Allergen(?p, ?f)

SWRL yeni birey yaratamaz. Baştaki her değişken gövdede bir bireye bağlanmış olmalıdır; aksi hâlde motor kuralı reddeder.

DL-safe kısıt: neden var?

  • OWL DL karar verilebilirdir; kural eklemek bu güvenceyi bozabilir.
  • Çözüm: kural değişkenleri yalnızca adlandırılmış bireylere bağlanır.
  • Sonuç: kural, anonim (çıkarımla var olduğu bilinen) bireyleri görmez.
  • Pratik etki: ontolojide bildirilmemiş bireyler üzerinde kural tetiklenmez.
Projede bu bir sorun değildir: bütün kişiler, ürünler, katkılar ve alerjiler adlandırılmış bireylerdir.

Hangi işi hangisi yapsın?

İşAraçNeden
Sınıf hiyerarşisiOWLReasoner sınıflandırır
Ayrıklık, tutarlılıkOWLÇelişki denetimi
AritmetikSWRLBuilt-in gerekir
Çok özellikli zincirSWRLDeğişken paylaşımı
Eşik/koşulSWRLKarşılaştırma built-in'i
Sayısal aralık sınıfıOWLVeri aralığı kısıtı

Projedeki iş bölümü: SWRL hesaplar ve zincirler, OWL sınıflandırır ve denetler.

03

Built-in'ler

Karşılaştırma, aritmetik, metin ve tarih işlemleri.

Sık kullanılan built-in'ler

GrupBuilt-inKullanım
Karşılaştırmaequal, notEqual, lessThan, greaterThanOrEqualYaş, BMI eşiği
Aritmetikadd, subtract, multiply, divide, pow, roundBMI, miktar
MetinstringConcat, contains, matches, upperCaseKatkı kodu eşleme
Tarihdate, dayTimeDuration, subtractDatesSon tüketim tarihi
ListelistConcat, length, memberToplu içerik işlemleri

Önek daima swrlb:. SQWRL'in sqwrl: öneki farklıdır — o sorgu içindir (Hafta 10).

Altın kural: sonuç ilk argümandır

swrlb:multiply(?h2, ?h, ?h) → ?h2 = ?h × ?h swrlb:divide(?b, ?w, ?h2) → ?b = ?w ÷ ?h2 swrlb:add(?t, ?a, 1) → ?t = ?a + 1

Karşılaştırma built-in'lerinde ise sonuç yoktur; atom yalnızca doğru/yanlış döner: swrlb:greaterThan(?a, 18).

Aritmetik: BMI adım adım

Person(?p) ^ hasWeight(?p, ?w) ^ hasHeight(?p, ?h) ^ swrlb:multiply(?h2, ?h, ?h) ^ swrlb:divide(?b, ?w, ?h2) -> hasBMI(?p, ?b)
TC_004w=91.0   h=1.65  →  h2=2.7225  →  b=33.43
TC_002w=84.6   h=1.73  →  h2=2.9929  →  b=28.26

Ara değer ?h2 için ontolojide özellik tanımlamak gerekmez; kural içinde geçici olarak yaşar.

Metin built-in'leri: E-kodu eşleme

# Etiketinde "E3" ile baslayan kod varsa antioksidan say FoodAdditives(?f) ^ hasCode(?f, ?c) ^ swrlb:matches(?c, "E3[0-9]{2}") -> Antioxidant(?f) # Rapor metni uret Person(?p) ^ hasName(?p, ?n) ^ swrlb:stringConcat(?msg, "RISK: ", ?n) -> hasWarning(?p, ?msg)
Ascorbic_Acid (E300) → Antioxidant   |   TC_001 → "RISK: Ayse"

Tarih built-in'i: tazelik denetimi

Product(?u) ^ hasExpiryDate(?u, ?d) ^ swrlb:date(?today, 2026, 9, 9) ^ swrlb:lessThan(?d, ?today) -> ExpiredProduct(?u)

Dikkat: SWRL'de "bugün" diye bir sabit yoktur — tarihi kural içine gömmek yerine Java tarafından parametre olarak vermek daha doğrudur (Hafta 10).

04

Projedeki Yedi Kural

S1'den S7'ye: tasarım gerekçeleri ve çıktılar.

Kural haritası

KuralGirdiÇıktıTür
S1_FishRiskSodium_AscorbiteFish_AllergenÖzel
S2_LactoseCaseinCaseinLactose_AllergenÖzel
S3_LactoseNisinNisinLactose_AllergenÖzel
S4_BMIhasWeight, hasHeighthasBMIAritmetik
S5_AdulthasAgeAdultEşik
S6_GenericAllergenZincir (4 özellik)Effected_AllergenGenel
S7_RiskClassEffected_AllergenPersonAtRiskSınıflandırma

S1_FishRisk — özel kural

Person(?p) ^ hasAllergy(?p, Fish) ^ ChooseProduct(?p, ?u) ^ Contain(?u, Sodium_Ascorbite) -> Fish_Allergen(?p, Sodium_Ascorbite)
  • Alerji ve katkı sabit birey olarak yazılı.
  • Okunması kolay, hata ayıklaması kolay.
  • Ama her katkı için ayrı kural gerekir — ölçeklenmez.
Tetiklenen: TC_003 (Fish + EAN_00003)

S2 ve S3 — aynı alerji, iki katkı

S2: Person(?p) ^ hasAllergy(?p, Lactose) ^ ChooseProduct(?p, ?u) ^ Contain(?u, Casein) -> Lactose_Allergen(?p, Casein) S3: Person(?p) ^ hasAllergy(?p, Lactose) ^ ChooseProduct(?p, ?u) ^ Contain(?u, Nisin) -> Lactose_Allergen(?p, Nisin)
S2 → TC_002, TC_003 (Casein)   |   S3 → TC_001 (Nisin)

İki kural neredeyse aynıdır — bu tekrar, S6'nın neden gerekli olduğunu gösterir.

S4_BMI — aritmetik kural

Person(?p) ^ hasWeight(?p, ?w) ^ hasHeight(?p, ?h) ^ swrlb:multiply(?h2, ?h, ?h) ^ swrlb:divide(?b, ?w, ?h2) -> hasBMI(?p, ?b)
KişiKilo / BoyBMIKategori
TC_00167.5 / 1.6823.92Normal
TC_00284.6 / 1.7328.26Fazla kilolu
TC_00393.0 / 1.8726.60Fazla kilolu
TC_00491.0 / 1.6533.43Obez

S4'ün sessiz hatası: literal tipi

Çalışmaz

<hasWeight>67.5</hasWeight> # tip yok → string kabul # multiply eslesmez # kural SESSIZCE bos doner

Çalışır

<hasWeight rdf:datatype="&xsd;double"> 67.5 </hasWeight>

Hata mesajı yoktur. Kural çalıştı, hiçbir sonuç üretmedi. Bu yüzden her kuralın beklenen çıktı sayısını önceden yazın.

S5_Adult — eşik kuralı

Person(?p) ^ hasAge(?p, ?a) ^ swrlb:greaterThanOrEqual(?a, 18) -> Adult(?p)
TC_001 (38) → Adult ✓ TC_002 (13) → ✗ TC_003 (35) → Adult ✓ TC_004 (54) → Adult ✓

TC_002 negatif test durumudur: kural tetiklenmemesi de doğrulanmalıdır. Sadece pozitif sonucu kontrol etmek, yanlış yazılmış eşiği gizler.

S6_GenericAllergen — çekirdek kural

Person(?p) ^ hasAllergy(?p, ?al) ^ ChooseProduct(?p, ?u) ^ Contain(?u, ?f) ^ Triggers(?f, ?al) -> Effected_Allergen(?p, ?f)
?p
?u
?f
?al
?p ↔ ?f

?al iki atomda paylaşılır — döngü burada kapanır. S1–S3'ün tamamının yerini tutar.

S6'nın TC_001 üzerinde eşleşmesi

Person(?p)?p = TC_001
hasAllergy(?p, ?al)?al = Lactose
ChooseProduct(?p, ?u)?u = EAN_00004
Contain(?u, ?f)?f ∈ {Ascorbic_Acid, Nisin, Soy_Lecitin}
Triggers(?f, ?al)yalnızca ?f = Nisin sağlar
→ sonuçEffected_Allergen(TC_001, Nisin)

S7_RiskClass — sınıflandırma

Person(?p) ^ Effected_Allergen(?p, ?f) -> PersonAtRisk(?p)

Üst özelliği kullanır; S1–S3'ün ürettiği alt özellikler (Lactose_Allergen vb.) RDFS çıkarımıyla buraya yükselir.

PersonAtRisk = TC_001, TC_002, TC_003, TC_004

Kurallar birbirini besler

S1 · S2 · S3Lactose_Allergen / Fish_Allergen (alt özellik)
RDFSsubPropertyOf → Effected_Allergen
S6Effected_Allergen (doğrudan, genel)
S7PersonAtRisk

Motor bu sırayı kendisi bulur: Drools ileri zincirleme (forward chaining) yapar, sabit noktaya kadar tekrarlar. Kural sırası yazım sırası değildir.

Kısıtları işleyen kurallar

# K1 — Cocuk + obez: yuksek oncelikli uyari Person(?p) ^ hasAge(?p, ?a) ^ swrlb:lessThan(?a, 18) ^ hasBMI(?p, ?b) ^ swrlb:greaterThanOrEqual(?b, 25.0) -> HighPriorityCase(?p) # K2 — Miktar esigi: 10 mg uzeri alerjen kritik Person(?p) ^ Effected_Allergen(?p, ?f) ^ hasAmountMg(?f, ?m) ^ swrlb:greaterThan(?m, 10.0) -> CriticalExposure(?p, ?f)
K1 → TC_002 (13 yaş, BMI 28.26)

Kısıt kuralları — devam

# K3 — Coklu alerjen: iki farkli katki tetikliyorsa Person(?p) ^ Effected_Allergen(?p, ?f1) ^ Effected_Allergen(?p, ?f2) ^ differentFrom(?f1, ?f2) -> MultiExposurePerson(?p) # K4 — Guvenli secim: hicbir katki alerjiyi tetiklemiyorsa Person(?p) ^ ChooseProduct(?p, ?u) ^ Contain(?u, ?f) ^ hasAllergy(?p, ?al) ^ NotTriggers(?f, ?al) -> SafeChoice(?p, ?u)

K4 dikkat: SWRL'de olumsuzlama yoktur. NotTriggers ayrı bir özellik olarak açıkça bildirilmelidir — açık dünya gereği "tetiklemiyor" bilgisi kendiliğinden doğmaz.

SWRL'de olumsuzlama sorunu

  • "Alerjeni olmayan kişi" doğrudan yazılamaz — not atomu yoktur.
  • Neden: açık dünya + monotonluk. Eksik bilgi yokluk sayılamaz.
  • Çözüm 1: olumsuz bilgiyi açıkça bildir (NotTriggers).
  • Çözüm 2: OWL tarafında kapanış aksiyomu + only kısıtı kullan.
  • Çözüm 3: SQWRL sorgusunda küme farkı al (Hafta 10).

05

Protégé'de SWRL

Kural yazma, Drools'a aktarma, sonucu geri yazma.

Protégé ekranı: SWRLTab kural listesi

EntitiesIndividuals by classSWRLTabSQWRLTab
NameRule
S4_BMIPerson(?p) ^ hasWeight(?p,?w) ^ hasHeight(?p,?h) ^ swrlb:multiply(?h2,?h,?h) ^ swrlb:divide(?b,?w,?h2) → hasBMI(?p,?b)
S5_AdultPerson(?p) ^ hasAge(?p,?a) ^ swrlb:greaterThanOrEqual(?a,18) → Adult(?p)
S6_GenericAllergenPerson(?p) ^ hasAllergy(?p,?al) ^ ChooseProduct(?p,?u) ^ Contain(?u,?f) ^ Triggers(?f,?al) → Effected_Allergen(?p,?f)
New Edit Clone Delete

Şematik gösterim. Kural adı boş bırakılamaz; ad, hata ayıklarken hangi kuralın çalıştığını söyler.

Protégé ekranı: kural editörü

SWRL Rule Editor
NameS6_GenericAllergen
CommentGenel risk zinciri
Rule Person(?p) ^ hasAllergy(?p, ?al) ^ ChooseProduct(?p, ?u) ^ Contain(?u, ?f) ^ Triggers(?f, ?al) -> Effected_Allergen(?p, ?f) ✓ Rule is valid

Editör sözdizimini anında denetler. ^ yerine , da yazılabilir; ok -> zorunludur.

Protégé ekranı: Drools akışı

SWRLTab  ›  Drools Rule Engine
1 · OWL+SWRL → Drools 2 · Run Drools 3 · Drools → OWL
Transferred 118 OWL axioms and 7 SWRL rules to rule engine Ran rule engine. 14 inferred axioms Transferred 14 inferred axioms to OWL model

Üçüncü düğmeye basılmazsa sonuç yalnızca motorda kalır — ontoloji değişmez. Sınıfta en çok atlanan adım budur.

Protégé ekranı: kural sonrası birey

Individuals by classSWRLTab
Person TC_001 TC_002TC_003TC_004
Types Person Adult  · PersonAtRisk  (S5, S7) Property assertions Effected_Allergen  Nisin  (S6) hasBMI  23.92  (S4)

Kural dosyada nasıl duruyor?

<swrl:Imp rdf:about="#S5_Adult"> <swrl:body> <swrl:AtomList> <rdf:first> <swrl:ClassAtom> <swrl:classPredicate rdf:resource="#Person"/> <swrl:argument1 rdf:resource="#p"/> </swrl:ClassAtom> </rdf:first> <rdf:rest> ... </rdf:rest> </swrl:AtomList> </swrl:body> </swrl:Imp>

Kural, RDF listesi olarak saklanır. Elle yazmayın — bu yüzden SWRL API kullanıyoruz.

06

Java Tarafı

Class, individual, OTP, DTP ve kuralın kodla kurulması.

Java — Class ve SubClass

OWLClass person = df.getOWLClass(IRI.create(NS + "Person")); OWLClass atRisk = df.getOWLClass(IRI.create(NS + "PersonAtRisk")); // Sinif bildirimi man.addAxiom(ont, df.getOWLDeclarationAxiom(atRisk)); // PersonAtRisk ⊑ Person man.addAxiom(ont, df.getOWLSubClassOfAxiom(atRisk, person));
Declaration + SubClassOf = Protégé'de "Add subclass" düğmesi

Java — Individual

OWLNamedIndividual tc5 = df.getOWLNamedIndividual(IRI.create(NS + "TC_005")); man.addAxiom(ont, df.getOWLClassAssertionAxiom(person, tc5)); // Bireyler farkli olsun (cardinality icin gerekli) man.addAxiom(ont, df.getOWLDifferentIndividualsAxiom( tc5, df.getOWLNamedIndividual(IRI.create(NS + "TC_001"))));

ClassAssertionAxiom = Protégé'deki "Types" satırı.

Java — Object Property (OTP)

OWLObjectProperty hasAllergy = df.getOWLObjectProperty(IRI.create(NS + "hasAllergy")); // Domain / Range man.addAxiom(ont, df.getOWLObjectPropertyDomainAxiom(hasAllergy, person)); man.addAxiom(ont, df.getOWLObjectPropertyRangeAxiom(hasAllergy, df.getOWLClass(IRI.create(NS + "Allergy")))); // Bildirim: TC_005 hasAllergy Gluten man.addAxiom(ont, df.getOWLObjectPropertyAssertionAxiom( hasAllergy, tc5, df.getOWLNamedIndividual(IRI.create(NS + "Gluten"))));

Java — Data Property (DTP)

OWLDataProperty hasAge = df.getOWLDataProperty(IRI.create(NS + "hasAge")); man.addAxiom(ont, df.getOWLDataPropertyRangeAxiom(hasAge, df.getIntegerOWLDatatype())); // TIPLI literal — S5 kuralinin calismasi icin sart man.addAxiom(ont, df.getOWLDataPropertyAssertionAxiom( hasAge, tc5, df.getOWLLiteral(16))); // xsd:int

getOWLLiteral(16) otomatik xsd:int üretir; getOWLLiteral("16") ise string — kural çalışmaz.

Java — S5 kuralını kodla kurmak

SWRLVariable p = df.getSWRLVariable(IRI.create(NS + "p")); SWRLVariable a = df.getSWRLVariable(IRI.create(NS + "a")); SWRLAtom c1 = df.getSWRLClassAtom(person, p); SWRLAtom c2 = df.getSWRLDataPropertyAtom(hasAge, p, a); SWRLAtom c3 = df.getSWRLBuiltInAtom( IRI.create("http://www.w3.org/2003/11/swrlb#greaterThanOrEqual"), Arrays.asList(a, df.getSWRLLiteralArgument(df.getOWLLiteral(18)))); SWRLAtom head = df.getSWRLClassAtom( df.getOWLClass(IRI.create(NS + "Adult")), p); man.addAxiom(ont, df.getSWRLRule( new HashSet<>(Arrays.asList(c1, c2, c3)), Collections.singleton(head)));

Java — kural motorunu çalıştır

SWRLRuleEngine engine = SWRLAPIFactory.createSWRLRuleEngine(ont); engine.infer(); // Drools ileri zincirleme OWLClass adult = df.getOWLClass(IRI.create(NS + "Adult")); EntitySearcher.getIndividuals(adult, ont) .forEach(i -> System.out.println("Adult: " + i));
Adult: TC_001 Adult: TC_003 Adult: TC_004 (TC_002 ve TC_005 yok — 18 alti)

07

Ödev ve Proje Adımı

Kendi kural tabanınızı kurun ve doğrulayın.

Ödev 7 — Kural tabanı

  1. Ontolojinize altı kural yazın: biri aritmetik, biri eşik, biri zincir, biri metin, ikisi kısıt.
  2. Her kural için beklenen çıktıyı önceden yazın; sonra doğrulayın.
  3. Bir negatif test durumu kurun (tetiklenmemesi gereken birey).
  4. Kurallardan birini Java'da SWRL API ile kurun ve çalıştırın.
  5. Drools → OWL sonrası ontolojiyi kaydedip aksiyom sayısı farkını raporlayın.

Teslim

Kural tablosu (ad, amaç, beklenen/gerçek çıktı) + .owl + Java sınıfı + Protégé ekran görüntüleri.

Çözümü Hafta 08'in başında ele alacağız.

Değerlendirme ölçütleri

ÖlçütAğırlıkBeklenen
Kural çeşitliliği25%Altı tür temsil edilmiş
Güvenli kural15%Bağlanmamış değişken yok
Beklenen çıktı analizi20%Önceden yazılmış, karşılaştırılmış
Negatif test15%Tetiklenmeme doğrulanmış
Java ile kural kurma25%Kod çalışıyor, sonuç aynı

Kaynaklar

  • W3C — SWRL: A Semantic Web Rule Language Combining OWL and RuleML (2004).
  • W3C — SWRL Built-in Specification.
  • O'Connor, M. — SWRLAPI ve SWRLTab belgeleri (Stanford BMIR).
  • Motik, B., Sattler, U., Studer, R. — Query Answering for OWL-DL with Rules (DL-safe).
  • Drools belgeleri — ileri zincirleme ve çakışma çözümü.

Özet  •  1 / 2

Kural dili

  • Gövde VE'lenmiş atomlardan oluşur; baş tek sonuç üretir.
  • Baştaki her değişken gövdede bağlanmalıdır — SWRL birey yaratmaz.
  • Built-in'lerde sonuç ilk argümandır; karşılaştırmada sonuç yoktur.
  • Literal tipi eksikse kural sessizce boş döner — en pahalı hata.
  • Olumsuzlama yoktur; olumsuz bilgi açıkça bildirilir.

Özet  •  2 / 2

Proje kuralları ve sonraki adım

  • S1–S3 özel, S6 genel: genel kural üçünün yerini tutar.
  • S4 hesaplar, S5 eşikler, S7 sınıflandırır.
  • Alt özellik hiyerarşisi S7'yi tek satırda tutar.
  • Drools → OWL basılmazsa ontoloji değişmez.

Hafta 08'de

Java ile OWL API-I: Maven kurulumu, ontolojiyi sıfırdan programatik kurma, aksiyom yönetimi.

Ayrıca: Ödev 7'nin ayrıntılı çözümü.

Tekrar Soruları

Kendinizi sınayın

  1. S6, S1–S3'ün yerini nasıl tutuyor?
  2. multiply(?h2, ?h, ?h) neden bu sırada yazılır?
  3. Bağlanmamış değişken hatası neye benzer?
  4. DL-safe kısıt projeyi nasıl etkiliyor?
  1. Neden "alerjeni olmayan kişi" kuralı yazılamaz?
  2. Drools → OWL düğmesi atlanırsa ne olur?
  3. getOWLLiteral("16") hangi hatayı doğurur?
  4. S7 neden alt özellikleri tek tek yazmıyor?

Alıştırma  •  Sınıf içi

Kuralı siz yazın

"BMI'si 30'un üzerinde ve riskli ürün seçen kişiler" için bir kural yazın.

Person(?p) ^ ______(?p, ?b) ^ swrlb:______(?b, 30.0) ^ ______(?p, ?f) -> ______(?p)

Sorular

  1. Bu kural S4'ten önce çalışabilir mi?
  2. Hangi kişi tetiklenir?
  3. Aynı sonucu OWL ile yazabilir miydiniz?

Çözüm Hafta 08'de.